package com.ruoyi.system.utils;

import com.ruoyi.system.config.MinioConfig;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.UUID;

@Component
public class MinioUploadUtil {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioConfig minioConfig;

    /**
     * 上传文件到 MinIO，并返回可访问的 URL
     * @param file 待上传的文件（如图片）
     * @return 文件访问路径（如：http://119.29.117.29:9000/nalang/xxx.png）
     */
    public String uploadFile(MultipartFile file) throws Exception {
        // 1. 生成唯一文件名（避免重复覆盖）
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); // 如 .png
        String fileName = UUID.randomUUID().toString() + suffix; // 如：f47ac10b-58cc-4372-a567-0e02b2c3d479.png

        // 2. 获取存储桶名和 MinIO 地址
        String bucketName = minioConfig.getBucketName();
        String endpoint = minioConfig.getEndpoint();

        // 3. 上传文件到 MinIO
        try (InputStream inputStream = file.getInputStream()) {
            minioClient.putObject(
                PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(fileName) // 存储到桶中的文件名
                    .stream(inputStream, file.getSize(), -1) // 文件流和大小
                    .contentType(file.getContentType()) // 内容类型（如 image/png）
                    .build()
            );
        }

        // 4. 生成文件访问 URL（格式：MinIO地址/桶名/文件名）
        // 注意：需确保桶已设置公开访问权限（否则 URL 无法直接访问）
        return endpoint + "/" + bucketName + "/" + fileName;
    }
}